home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Original Shareware 1.1
/
The Original Shareware (WeMake CDs)(Volume 1.1)(CDs, Inc)(1993).iso
/
23
/
cputimer.zip
/
CPU2.ASM
next >
Wrap
Assembly Source File
|
1986-03-05
|
6KB
|
317 lines
TITLE CPU2
;
; CPU2 WAS TAKEN FROM PUBLIC DOMAIN AND MODIFIED TO PROVIDE
; A REPRESENTATIVE INSTRUCTION MIX FOR QUANTIFYING SPEED
; OF ONE'S 8086/8088/80186/80286 COMPUTER IN TERMS OF STANDARD
; IBM-PC. RESULT IS IN EFFECTIVE CLOCK RATE (I.E. YOUR COMPUTER
; RUNS AS FAST AS AN IBM PC WITH THE FOLLOWING CLOCK RATE)
;
; (ADDED SIEVE OF ERATOSTHENES BENCHMARK WITH TIMER TO PROVIDE
; AN ADDITIONAL BENCHMARK) - KIM LEVITT (MBBS HQ PDSE (213) 653-6398)
;
; (SOURCE FOR CPU BENCHMARK AND SIEVE COPIED FROM MICRO/SYSTEMS
; JOURNAL NOV/DEC 1985 ISSUE, ARTICLE: "TURBO CHARGE YOUR 8086/8088
; COMPUTER" BY STEPHEN R. DAVIS, ROUTE 5 BOX 107K, GREENVILLE, TX 75401)
;
LF EQU 0AH
CR EQU 0DH
HUNDRED EQU 64H
THOUSAND EQU 3E8H
TEN EQU 0AH
NTIMES EQU 8190 ;STANDARD SIZE
NLOOPS EQU 10 ;TEN ITERATIONS STANDARD
CSEG SEGMENT PUBLIC PARA
ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:NOTHING
ORG 100H
; FIRST OUTPUT A 'WAIT A MINUTE' MESSAGE AND THEN GET TIME
START:
MOV AH,9
MOV DX,OFFSET INIT_MSG
INT 21H
MOV AH,2CH
INT 21H
MOV TIME1,DX
STI ;BE SURE CLOCK IS RUNNING
;HERE IS THE BIG TIMING LOOP
XOR AX,AX
MOV DX,TEN
OUTERLOOP:
MOV CX,03B84H ;THIS NUMBER MUST BE AD-
;JUSTED FOR DIFFERENT MIXES
TIMERLOOP:
;MY MIX OF REPRESENTATIVE, USEFUL INSTRUCTIONS -
;USER MAY PROVIDE HIS OWN AND REASSEMBLE, BEING CAREFUL
;TO ADJUST CONSTANT ABOVE FOR TOTAL NUMBER
MOV AX,BX ;REGISTER TO REGISTER MOVE
MOV AX,BX ;(FAR AND AWAY MOST COMMON)
MOV AX,BX
MOV AX,BX
MOV AX,BX
MOV AX,BX
MOV AX,10[BX] ;COMPLEX ADDRESSING
MOV AX,10[BX] ;(PRETTY COMMON)
MOV AX,10[BX]
MOV AX,10[BX]
ADD AX,AX ;REG-REG ARITHMETIC
ADD AX,10 ;REG-IMMED ARITHMETIC
PUSH CX ;PUSH (POP FOLLOWS) ARE COMMON
MOV CL,5
SHL AX,CL
POP CX
CALL DUMMY_ROUTINE ;THESE CALLS/JUMPS SHOULD ALSO
;FAVOR NEC
JMP CONTINUE
DUMMY_ROUTINE PROC NEAR
RET
DUMMY_ROUTINE ENDP
CONTINUE:
LOOP TIMERLOOP
DEC DX
JNZ OUTERLOOP
; NOW GET TIME AGAIN (AFTER LOOP)
MOV AH,2CH
INT 21H
; OK - CONVERT THIS INTO CLOCK SPEED RELATIVE TO 8088
; AND OUTPUT IN ASCII FORM
MOV AX,HUNDRED
IMUL DH
MOV DH,0
ADD AX,DX
MOV BX,AX
MOV DX,TIME1
MOV AX,HUNDRED
IMUL DH
MOV DH,0
ADD AX,DX
SUB BX,AX
JNB SKIP
ADD BX,1770H
SKIP:
MOV AX,BX
MOV TIME2,BX
MOV BP,OFFSET VALUE1
MOV BX,THOUSAND
CWD
IDIV BX
CALL CONVERT2NUM ;CONVERT FIRST VALUE & STORE
MOV BX,HUNDRED ;HUNDREDS DIGIT
MOV AX,DX
CWD
IDIV BX
CALL CONVERT2NUM
INC BP
MOV BX,TEN ;TENS DIGIT
MOV AX,DX
CWD
IDIV BX
CALL CONVERT2NUM
MOV AX,DX
CALL CONVERT2NUM
MOV AH,9
MOV DX,OFFSET RES_MSG
INT 21H
MOV AX,12A2H/TEN ;CALCULATE EFFECTIVE CLOCK RATE
CWD
MOV BX,TIME2
DIV BX
MOV BP,OFFSET VALUE2
CALL CONVERT2NUM ;TENS DIGIT
MOV AX,DX
MOV CX,TEN
MUL CX
DIV BX
CALL CONVERT2NUM ;ONES DIGIT
INC BP
MOV AX,DX
MUL CX
DIV BX
CALL CONVERT2NUM ;TENTHS DIGIT
MOV AX,DX
MUL CX
DIV BX
CALL CONVERT2NUM ;HUNDRETHS DIGIT
MOV AH,9
MOV DX,OFFSET RES_MSG2
INT 21H
MOV AH,9
MOV DX,OFFSET INIT_MSG2
INT 21H
MOV AH,2CH
INT 21H
MOV TIME1,DX
STI ;BE SURE CLOCK IS RUNNING
START2:
MOV LOOP_CNT,NLOOPS ;INIT LOOP COUNTER
OUTER_LOOP:
XOR AX,AX ;FIRST ZERO OUT FLAG ARRAY
MOV DI,OFFSET ARRAY
MOV CX,NTIMES/2
CLD
REP STOSW
;NOW COUNT THE PRIMES
XOR DX,DX ;KEEP THE COUNT IN DX
XOR BX,BX ;START AT SUBSCRIPT 0
MOV CX,NTIMES ;GET THE LOOP COUNT
MOV DI,CX
INNER_LOOP:
CMP BYTE PTR ARRAY[BX],0
JNZ SKIP_AROUND
MOV AX,BX
ADD AX,BX
ADD AX,3
MOV PRIME,AX
MOV SI,BX ;NOW MARK OUT MULTIPLES
ADD SI,AX
MARK_OUT:
MOV BYTE PTR ARRAY[SI],0FFH ;MARK THIS MULTIPLE OUT
ADD SI,AX
CMP SI,DI ;IS THAT IT
JNA MARK_OUT
INC DX ;INCREMENT PRIME NUMBER COUNT
SKIP_AROUND:
INC BX
LOOP INNER_LOOP
MOV COUNT,DX ;NOW COUNT IS IN DX REGISTER
DEC LOOP_CNT ;DO IT TEN TIMES
JNZ OUTER_LOOP
; NOW GET TIME AGAIN (AFTER LOOP)
MOV AH,2CH
INT 21H
; OK - CONVERT THIS INTO REAL TIME
; AND OUTPUT IN ASCII FORM
MOV AX,HUNDRED
IMUL DH
MOV DH,0
ADD AX,DX
MOV BX,AX
MOV DX,TIME1
MOV AX,HUNDRED
IMUL DH
MOV DH,0
ADD AX,DX
SUB BX,AX
JNB SKIP2
ADD BX,1770H
SKIP2:
MOV AX,BX
MOV TIME2,BX
MOV BP,OFFSET VALUE3
MOV BX,THOUSAND
CWD
IDIV BX
CALL CONVERT2NUM ;CONVERT FIRST VALUE & STORE
MOV BX,HUNDRED ;HUNDREDS DIGIT
MOV AX,DX
CWD
IDIV BX
CALL CONVERT2NUM
INC BP
MOV BX,TEN ;TENS DIGIT
MOV AX,DX
CWD
IDIV BX
CALL CONVERT2NUM
MOV AX,DX
CALL CONVERT2NUM
MOV AH,9
MOV DX,OFFSET RES_MSG3
INT 21H
MOV AH,4CH ;TERMINATE
INT 21H
CONVERT2NUM:
OR AL,30H ;'0'
MOV [BP+0],AL
INC BP
RET
INIT_MSG EQU $
DB CR,LF
DB 'CPU2: SPEED CHECKER/BENCHMARK PROGRAM',CR,LF
DB '01/07/86 -- Stephen R. Davis, Kim Levitt',CR,LF
DB CR,LF
DB 'BENCHMARK #1: - Mixed Instruction Repetition',CR,LF
DB CR,LF
DB ' Please wait...',CR,LF
DB CR,LF,'$'
RES_MSG EQU $
DB ' Execution time is 10.00 secs on a 4.77 Mhz 8088',CR,LF
DB ' with no waits on RAM access.',CR,LF
DB CR,LF
DB ' Actual execution time here = '
VALUE1 DB '00.00'
DB ' seconds.',CR,LF,'$'
RES_MSG2 EQU $
DB ' Effective 8088 clock speed = '
VALUE2 DB '00.00'
DB ' Mhz',CR,LF
DB CR,LF,'$'
INIT_MSG2 EQU $
DB 'BENCHMARK #2 - Sieve of Eratosthenes, 10 reps',CR,LF
DB CR,LF
DB ' Please wait...',CR,LF
DB CR,LF,'$'
RES_MSG3 EQU $
DB ' Execution time is 3.68 secs on a 4.77 Mhz 8088',CR,LF
DB ' with no waits on RAM access.',CR,LF
DB CR,LF
DB ' Actual execution time here = '
VALUE3 DB '00.00'
DB ' seconds.',CR,LF,'$'
;DEFINE OUR VARIABLES DOWN HERE
TIME1 DW 0000
TIME2 DW 0000
LOOP_CNT DW 0
PRIME DW 0
COUNT DW 0
ARRAY DB NTIMES DUP (0)
CSEG ENDS
END START